home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok01.lha / M2Error / M2Err.mod < prev    next >
Encoding:
Text File  |  1993-08-16  |  8.7 KB  |  264 lines

  1. (*---------------------------------------------------------------------------
  2.    :Program.    M2Err
  3.    :Author.     Fridtjof Björn Siebert (Amok)
  4.    :Address.    Nobileweg 67, D-7000 Stuttgart-40
  5.    :Phone.      (0)711/822509
  6.    :Shortcut.   [fbs]
  7.    :Version.    1.0
  8.    :Date.       14.04.88
  9.    :Copyright.  PD, but of course contributions are wellcomed.
  10.    :Language.   Modula-II
  11.    :Translator. M2Amiga
  12.    :Imports.    none.
  13.    :Contents.   Program to type compile-errors.
  14.    :Remark.     Usage: M2Err Source
  15.    :Bugs.       none known yet. I still don't know what c1455252H in Error-
  16.    :Bugs.       file means, but I guess it's not important.
  17. ---------------------------------------------------------------------------*)
  18.  
  19. (*-------------------------------------------------------------------------*)
  20. (*                            -----------------                            *)
  21. (*                 -   -   -   -  M 2 E R R  -  -  -  -  -                 *)
  22. (*                            -----------------                            *)
  23. (*                                                                         *)
  24. (*  © 1988 by Fridtjof Siebert                                             *)
  25. (*            Nobileweg 67                                                 *)
  26. (*            7000 Stuttgart 40 (Stammheim)                                *)
  27. (*            Germany                                                      *)
  28. (*     Phone: (0)711/822509                                                *)
  29. (*                                                                         *)
  30. (*  Usage:                                                                 *)
  31. (*    M2Err Source                                                         *)
  32. (*                                                                         *)
  33. (*-------------------------------------------------------------------------*)
  34.  
  35. MODULE M2Err;
  36.  
  37. (*------  Importlist:  ------*)
  38.  
  39. FROM SYSTEM IMPORT ADR,ADDRESS,BYTE,WORD,BITSET,SHIFT,CAST;
  40. FROM Arts IMPORT detectCtrlC,TermProcedure;
  41. FROM Arguments IMPORT NumArgs,GetArg;
  42. FROM Dos IMPORT Open,Close,Read,Write,FileHandlePtr,oldFile,newFile,Output;
  43. FROM Exec IMPORT AllocMem,FreeMem,MemReqSet,MemReqs;
  44. FROM InOut IMPORT WriteString,WriteLn,WriteCard;
  45. FROM Strings IMPORT first,last,Delete,Copy,Insert,Compare,Length,Occurs;
  46. FROM Conversions IMPORT ValToStr,StrToVal;
  47.  
  48. (*------  Constants:  ------*)
  49.  
  50. CONST
  51.   M2Errs = "s:Modula-2 Fehlermeldungen";
  52.  
  53. (*------  Types:  ------*)
  54.  
  55. TYPE
  56.   ArgStr  = ARRAY[0..79] OF CHAR;
  57.   String2 = ARRAY[0..1] OF CHAR;
  58.  
  59. (*------  Variables:  ------*)
  60.  
  61. VAR
  62.   argc: CARDINAL;                     (* count args *)
  63.   SourceFile: ArgStr;                 (* The Modula-File *)
  64.   ErrFile: ArgStr;                    (* The Error-File *)
  65.   i,j: INTEGER;                       (* no special use *)
  66.   ic,jc:CARDINAL;                     (* no special use *)
  67.   il: ADDRESS;
  68.   InBuffer: POINTER TO CARDINAL;      (* Buffer for Input *)
  69.   LongInBuf: POINTER TO ARRAY[0..15] OF LONGCARD;
  70.   CharInBuf: POINTER TO ARRAY[0..1] OF CHAR;
  71.   SInBuffer: POINTER TO ARRAY[0..255] OF CHAR;
  72.   InH,SInH: FileHandlePtr;            (* FileHandles for I/O *)
  73.   len: LONGCARD;                      (* for saving Writes's result *)
  74.   ok: BOOLEAN;                        (* for getting boolean results *)
  75.   Errors: POINTER TO ARRAY [0..14FFH] OF LONGCARD; (* For Error-Msgs *)
  76.   ErrorNum: POINTER TO ARRAY [0..29FFH] OF CARDINAL;
  77.   ErrorTxt: POINTER TO ARRAY[0..53FFH] OF CHAR;
  78.   Line: CARDINAL;                     (* this counts lines *)
  79.   TextAdr,OldTextAdr: ADDRESS;        (* Address in source *)
  80.   ActLine: ARRAY[0..255] OF CHAR;     (* The actual Line *)
  81.   ActChr: CARDINAL;
  82.   ErrAdr: ADDRESS;
  83.   ErrCnt: CARDINAL;                   (* this counts errors *)
  84.   CharAdr: ADDRESS;
  85.   ReadChrCnt,ReadChrLen: CARDINAL;    (* Variables for ReadChar *)
  86.  
  87. (*-----------------------  CleanUp  ---------------------------------------*)
  88.  
  89. PROCEDURE CleanUp();
  90.  
  91. BEGIN
  92.   (*------  Close Files:  ------*)
  93.  
  94.   Close(InH);
  95.   Close(SInH);
  96.  
  97.   (*------  Give Mem back:  ------*)
  98.  
  99.   FreeMem(InBuffer,512+5500H);
  100.  
  101. END CleanUp;
  102.  
  103. (*----------------------  ReadChar  ---------------------------------------*)
  104.  
  105. PROCEDURE ReadChar(): CHAR;
  106.  
  107. BEGIN
  108.   IF ReadChrCnt=ReadChrLen THEN
  109.     ReadChrLen := CARDINAL(Read(SInH,SInBuffer,256)); ReadChrCnt := 0;
  110.   END;
  111.   INC(ReadChrCnt);
  112.   RETURN SInBuffer^[ReadChrCnt-1];
  113. END ReadChar;
  114.  
  115. (*--------------------  WriteError  ---------------------------------------*)
  116.  
  117. PROCEDURE WriteErr(Number:CARDINAL);
  118.  
  119. VAR
  120.   i: LONGCARD;
  121.   j: CARDINAL;
  122.   P: POINTER TO LONGCARD;
  123.  
  124. BEGIN
  125.   i:=0; j:=0; ActLine := "";
  126.   WHILE ErrorNum^[SHIFT(i,-1)+2]<Number DO
  127.     P := ADR(ErrorTxt^[i]); i := P^;
  128.   END;
  129.   IF ErrorNum^[(i DIV 2)+2]=Number THEN
  130.     WHILE ErrorTxt^[i+5]#CHAR(0) DO
  131.       ActLine[j] := ErrorTxt^[i+6]; INC(i); INC(j);
  132.     END;
  133.   ELSE
  134.     ActLine := "???";
  135.   END;
  136.   WriteString(ActLine);
  137. END WriteErr;
  138.  
  139. (*-------------------------  Start  ---------------------------------------*)
  140.  
  141. BEGIN
  142. detectCtrlC := FALSE;  (* you mustn't stop this programme *)
  143.  
  144. (*------  Get Commandline:  ------*)
  145.  
  146. argc := NumArgs();
  147. IF argc>1 THEN WriteString("Too many parameters"); WriteLn(); HALT; END;
  148.  
  149. (*------  No Parameters? Then type Usage:  ------*)
  150.  
  151. IF argc=0 THEN
  152.   WriteString("Usage:"); WriteLn;
  153.   WriteString("  M2Err Source"); WriteLn;
  154.   WriteLn;
  155.   WriteString("  Source: The File which the errors are to be shown of."); WriteLn;
  156.   WriteString(" © 1988 by Fridtjof Siebert, Nobileweg 67, D-7000 Stgt-40"); WriteLn;
  157.   WriteString("    Phone: (0)711/822509"); WriteLn;
  158.   HALT;
  159. END;
  160.  
  161. (*------  Who's the author?  ------*)
  162.  
  163. WriteString(" M2Err -- 14. 4.88, © Fridtjof Siebert"); WriteLn;
  164.  
  165. (*------  read parameter  ------*)
  166.  
  167. GetArg(1,SourceFile,j);
  168. ErrFile := SourceFile; Insert(ErrFile,last,"E");
  169.  
  170. (*------  get Memory  ------*)
  171.  
  172. InBuffer  := AllocMem(512+5500H,MemReqSet{chip});
  173. IF InBuffer=NIL THEN WriteString("Zu wenig Speicher !!!"); HALT END;
  174. LongInBuf := ADDRESS(InBuffer);
  175. CharInBuf := ADDRESS(InBuffer);
  176. SInBuffer := ADDRESS(ADDRESS(InBuffer) + 256);
  177. Errors := ADDRESS(ADDRESS(InBuffer)+512);
  178. ErrorNum := ADDRESS(Errors);
  179. ErrorTxt := ADDRESS(Errors);
  180.  
  181. (*------  Read Errormessages:  ------*)
  182.  
  183. InH := Open(ADR(M2Errs),oldFile);
  184. IF InH=NIL THEN
  185.   FreeMem(InBuffer,512+5500H);
  186.   WriteString("Konnte Fehlermelmeldungen nicht öffnen."); WriteLn; HALT;
  187. END;
  188.  
  189. len := Read(InH,Errors,5500H);
  190. Close(InH);
  191.  
  192. (*------  Init Main Loop:  ------*)
  193.  
  194. ReadChrCnt := 0; ReadChrLen := 0; (* defaults for ReadChar *)
  195. Line := 0; (* this counts the lines *)
  196. CharAdr := 307;
  197. TextAdr := 0; (* the current Address in Source *)
  198. ErrCnt := 0; (* this counts the errors *)
  199.  
  200. InH := Open(ADR(ErrFile),oldFile);
  201. IF InH=NIL THEN
  202.   FreeMem(InBuffer,512+5500H);
  203.   WriteString("Konnte Fehlerdatei nicht öffnen."); WriteLn; HALT;
  204. END;
  205.  
  206. SInH := Open(ADR(SourceFile),oldFile);
  207. IF SInH=NIL THEN
  208.   FreeMem(InBuffer,512+5500H);
  209.   WriteString("Konnte Quelldatei nicht öffnen."); WriteLn; HALT;
  210. END;
  211.  
  212. len := Read(InH,InBuffer,4); len := Read(InH,InBuffer,2); (* `AE' *)
  213.  
  214. TermProcedure(CleanUp); detectCtrlC := TRUE;
  215.  
  216. (*------  Main Loop:  ------*)
  217.  
  218. WHILE InBuffer^#0FFFFH DO
  219.   len := Read(InH,InBuffer,2);        (* `RR' *)
  220.   len := Read(InH,InBuffer,4);        (* Address in Source *)
  221.   ErrAdr := ADDRESS(LongInBuf^[0]);
  222.   IF TextAdr<ErrAdr THEN
  223.     WHILE TextAdr<ErrAdr DO
  224.       OldTextAdr := TextAdr;
  225.       CharInBuf^ := "x"; ActChr := 0;
  226.       REPEAT
  227.         ActLine[ActChr] := ReadChar(); INC(ActChr);
  228.       UNTIL ActLine[ActChr-1]=CHR(10); (* Until next LF *)
  229.       ActLine[ActChr] := CHAR(0);
  230.       INC(TextAdr,ActChr); INC(Line); CharAdr := 255;
  231.     END;
  232.     WriteString("-----"); WriteLn;
  233.     WriteCard(Line,4); WriteString(":"); WriteString(ActLine);
  234.   END;
  235.   IF CharAdr#ErrAdr-OldTextAdr THEN
  236.     CharAdr := ErrAdr-OldTextAdr;
  237.     ActLine := "   ";
  238.     FOR il:=0 TO CharAdr+1 DO Insert(ActLine,last," ") END;
  239.     Insert(ActLine,last,"|"); WriteString(ActLine); WriteLn;
  240.   END;
  241.   len := Read(InH,InBuffer,2);         (* Error-Number *)
  242.   WriteCard(InBuffer^,8); WriteString(": ");
  243.   REPEAT
  244.     WriteErr(InBuffer^); WriteString(" ");
  245.     len := Read(InH,InBuffer,2);      (* second Errornumber or endmark *)
  246.   UNTIL (InBuffer^=0FFFFH) OR (InBuffer^=0C145H);
  247.   WriteLn;
  248.   INC(ErrCnt);
  249. END;
  250.  
  251. WriteLn; WriteCard(ErrCnt,4); WriteString(" Fehler enthalten."); WriteLn;
  252.  
  253. (*------  That's it! ------*)
  254.  
  255. END M2Err.
  256.  
  257. (*-------------------------------------------------------------------------*)
  258. (*                                                                         *)
  259. (*  I don't believe it !!! This was written within one day !!? or better   *)
  260. (*  one afternoon and one night. Thanks to AMSoft not documenting their    *)
  261. (*  fileformats for errorfiles and the errorlist.                          *)
  262. (*                                                                         *)
  263. (*-------------------------------------------------------------------------*)
  264.